﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Text;
using System.Collections.ObjectModel;
using Entidades.Seguridad;

namespace Modelo.Seguridad
{
    public class CatalogoUsuarios
    {
        
        private List<Entidades.Seguridad.Usuario> Col_Usuarios;
        Int32 res;

        public CatalogoUsuarios()
        {
            Col_Usuarios = Mapping.Seguridad.MappingUsuarios.ConsultarUsuarios();
        }
        public ReadOnlyCollection<Entidades.Seguridad.Usuario> ListarUsuarios()
        {
            return Col_Usuarios.AsReadOnly();
        }
        public ReadOnlyCollection<Entidades.Seguridad.Usuario> ListarUsuarios(string nombapell, Boolean estado, string idGrupo)
        {

            if (idGrupo != "TODOS")
            {
                var query = from usu in Col_Usuarios
                            where (usu.NombreApellido.ToLower().Contains(nombapell.ToLower()))
                            from grup in usu.Grupos
                            where grup.IdGrupo == idGrupo
                            select usu;

                if (estado)
                {
                    query = query.Where(u => u.Estado);
                }

                return query.ToList().AsReadOnly();
            }
            else
            {
                var query = from usu in Col_Usuarios
                            where (usu.NombreApellido.ToLower().Contains(nombapell.ToLower()))
                            select usu;

                if (estado)
                {
                    query = query.Where(u => u.Estado);
                }

                return query.ToList().AsReadOnly();
            }
        }
        public bool AgregarUsuario(Entidades.Seguridad.Usuario ousuario)
        {
            Col_Usuarios.Add(ousuario);
            res = Mapping.Seguridad.MappingUsuarios.AgregarUsuario(ousuario);
            if (res > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool ValidarExistencia(Entidades.Seguridad.Usuario oUsuario)
        {
            if (this.Col_Usuarios.Count(x => x.IdUsuario == oUsuario.IdUsuario) == 0)
            {
                return true;
            }
            
            return false;
        }

        public bool EliminarUsuario(Entidades.Seguridad.Usuario ousuario)
        {
            Col_Usuarios.Remove(ousuario);
            return Mapping.Seguridad.MappingUsuarios.EliminarUsuario(ousuario);
        }
        
        public void ModificarUsuario(Entidades.Seguridad.Usuario ousuario)
        {
            Mapping.Seguridad.MappingUsuarios.ModificarUsuario(ousuario);
            Col_Usuarios.Remove(ousuario);
            Col_Usuarios.Add(ousuario);
        }

        public bool ValidarUsuarioGrupo(Entidades.Seguridad.Grupo oGrupo)
        {
            var query = from usu in Col_Usuarios
                        from grup in usu.Grupos
                        where grup.IdGrupo == oGrupo.IdGrupo
                        select usu;

            if (query.ToList().Count > 0)
            {
                return false;
            }
            return true;
        }

        public Entidades.Seguridad.Usuario BuscarUsuario(string nombreUsuario)
        {
          return this.Col_Usuarios.Find(oUsu => oUsu.IdUsuario == nombreUsuario );
        }

        public Entidades.Seguridad.Usuario BuscarUsuarioPorEmail(string email)
        {
            return this.Col_Usuarios.Find(oUsu => oUsu.Email == email);
        }
        
    }
}
